﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Lösungen
{
    internal class Warenkorb
    {
        private List<WarenkorbItem> warenkorbItemListe = new List<WarenkorbItem>();


        public bool ArtikelHinzufügen(Artikel artikel, ushort anzahl = 1) // durch 'ushort' verhindern wir negative Werte und '= 1' ist ein Default-Wert, womit das Argument beim Aufruf weggelassen werden kann.
        {
            if (artikel == null)
                throw new ArgumentNullException(nameof(artikel));

            try
            {
                // Wir suchen nach einem WarenkorbItem, in dem der Artikel der übergebene Artikel ist.
                WarenkorbItem? item = warenkorbItemListe.Find(x => x.Artikel == artikel);

                if (item == null) // Wenn wir keinen finden...
                {
                    item = new WarenkorbItem(artikel, anzahl); // erzeugen wir einen neuen.
                    warenkorbItemListe.Add(item);
                    return true;
                }
                else // Sonst...
                {
                    item.Anzahl = (ushort)(item.Anzahl + anzahl); // erhöhen wir die Anzahl.
                    return true;
                }
            }
            catch (Exception)
            {
                return false; // Kommt es dabei zu einem Fehler, geben wir false zurück.
            }
            
        }

        public bool ArtikelEntfernen(Artikel artikel, ushort anzahl)
        {
            if (artikel == null)
                throw new ArgumentNullException(nameof(artikel));

            try
            {
                // Wir suchen nach einem WarenkorbItem, in dem der Artikel der übergebene Artikel ist.
                WarenkorbItem? item = warenkorbItemListe.Find(x => x.Artikel == artikel);

                if (item != null) // Haben wir ihn gefunden...
                {
                    item.Anzahl = (ushort)(item.Anzahl - anzahl); // reduzieren wir die Anzahl.
                    if (item.Anzahl <= 0) // Ist die Anzahl 0 oder weniger,
                        warenkorbItemListe.Remove(item); // nehmen wir den Artikel ganz aus dem Warenkorb.

                    return true;
                }
                else // Haben wir keinen gefunden...
                {
                    return false; // geben wir false zurück.
                }
            }
            catch (Exception)
            {
                return false;
            }
        }

        public double GetGesamtpreis()
        {
            double summe = 0;
            foreach (WarenkorbItem item in warenkorbItemListe)
            {
                summe += item.Gesamtpreis;
            }
            return summe;
        }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            foreach (WarenkorbItem item in warenkorbItemListe)
            {
                sb.AppendLine(item.ToString());
            }

            sb.AppendLine($"{GetGesamtpreis():C2}");

            return sb.ToString();
        }

    }
}
